← 返回文章列表

办公聊天软件接入 Hermes Agent 实录(三):钉钉 Stream 模式长连接零公网跑通(个人开发者也能接,v0.20.0 实测)

基于 Hermes Agent(v0.20.0)+ Dify(1.16.1)实测。文中所有命令、日志片段、配置项均来自真实运行,未做美化。

目标读者:企业 IT 管理员、独立开发者、AI 应用交付工程师。

环境版本:Hermes Agent v0.20.0 + Dify 1.16.1 + 钉钉企业内部应用(Stream 模式)。

前置条件:已有可运行的 Hermes Gateway + Dify 知识库应用(接入方法见系列(一)企业微信篇)。

读完你将获得:① 钉钉 Stream 模式零公网接入完整四步法 ② 懒安装后 pycache 缓存导致 raw_process 缺失的根因与修复 ③ 钉钉/飞书/企微三平台并存架构 ④ 20.5s 响应带引用回复的验证日志。

一、为什么做这件事

⚠️ 本文基于 Hermes Agent v0.20.0、Dify 1.16.1、钉钉 Stream 模式 SDK 实测。钉钉开放平台的界面文案、Hermes 的配置项可能随版本调整,请以官方最新文档为准。

国内企业办公三巨头——飞书、企业微信、钉钉——前两个已经接进 Hermes 了(各自有独立文章),钉钉是最后一块拼图。三款都用同一套方案:聊天软件里问知识库/跑业务流程,机器人秒回带引用

钉钉有个额外的价值:个人开发者也能接。不需要企业资质,免费创建团队就能走通全流程——这篇文章把「个人怎么接」讲透。我们当初做三平台评估时,第一反应是「钉钉肯定最麻烦」——直到发现 Stream 模式:和飞书/企微一样的长连接逻辑,配置却最简(两个凭证搞定)——最后接的钉钉,反而是接入成本最低的

二、钉钉接入的两个认知(先看这个)

2.1 应用必须「挂」在某个组织下

钉钉的应用/机器人属于组织,创建那一刻就绑定,之后挪不走。个人开发者没有企业,就免费建一个「团队」(一个手机号最多建 10 个团队,免费,不需要认证):

手机钉钉 → 通讯录 → 创建加入企业/组织/团队 → 创建团队 → 起名(如 My Hermes Bot)

然后回到开放平台(open.dingtalk.com)扫码登录,顶部切换到新组织,再创建应用——应用就属于新组织了,和原来的彻底隔离。

2.2 Stream Mode 长连接,零公网依赖

钉钉接入有两种消息接收模式,我们用的是 Stream 模式(dingtalk-stream SDK 长连接):

架构链路:

graph TD A[钉钉客户端] -->|Stream Mode 长连接
dingtalk-stream SDK| B[Hermes Gateway] B -->|调 MCP 工具 dify_ask| C[Hermes Agent] C -->|HTTP POST /v1/chat-messages| D[Dify 知识库应用] D -->|返回 answer 带引用| C C -->|原样转发| B B -->|回推 + 表情交互| A

三、前置:创建组织 + 应用(人工步骤)

钉钉侧需要人工操作一次(参考官方指引,流程比飞书简单):

3.1 建团队(组织壳)

手机钉钉 → 通讯录 → 创建团队(1 分钟,免费,一个手机号最多 10 个团队)。

3.2 切组织 + 建应用

  1. open.dingtalk.com 扫码登录 → 顶部「选择组织」→ 选刚建的新组织(关键!建错地方挪不走)

  2. 应用开发 → 企业内部应用 → 创建应用 → 填名称/描述/图标

  3. 左侧「添加应用能力 → 机器人」→ 开启开关

  4. 消息接收模式选 Stream 模式(零公网,推荐)

3.3 发布与可见范围

  1. 版本管理与发布 → 创建版本 → 可用范围选你自己(关键!不选就搜不到)→ 保存并发布

  2. 凭证与基础信息 → 复制 Client ID + Client Secret

⚠️ 最容易漏的一步:必须走完「发布」流程——开发后台写好了不等于上线,不发布聊天框里搜不到机器人。发布后回到钉钉主界面直接搜应用名即可私聊。

四、Hermes 侧接入

# ~/.hermes/.env

DINGTALK_CLIENT_ID=dingxxx

DINGTALK_CLIENT_SECRET=xxx

DINGTALK_ALLOWED_USERS=*    # 白名单;* = 任何人(仅限开发测试!)
# 启用插件 + 重启

hermes plugins enable dingtalk-platform

hermes gateway restart

连接成功的标志(agent.log):

gateway.run: Connecting to dingtalk...

[Dingtalk] Robot SDK initialized (media download)

[Dingtalk] Connected via Stream Mode

gateway.run: ✓ dingtalk connected

一个小细节:gateway 检测到 dingtalk-stream SDK 缺失时会自动安装Lazy-installing dingtalk-stream==0.24.3),不需要手动 pip。

⚠️ DINGTALK_ALLOWED_USERS=* 仅限开发测试。生产环境必须填具体钉钉 User ID——从 gateway 日志的 sender_id 字段获取(收到第一条消息后复制)。否则任何知道机器人入口的人都能触发你的 Hermes Agent 调用 Dify,产生费用和安全风险。

4.1 健康状态对照(配置完后自检)

检查点 健康表现 异常表现 → 处理
SDK 依赖 自动懒安装 dingtalk-stream==0.24.3 懒安装后 pycache 缓存 → raw_process 缺失(见第五节)
连接 日志 ✓ dingtalk connected + Connected via Stream Mode 无此行 → Client ID/Secret 错
消息接收 inbound message: platform=dingtalk 连接正常但无此行 → User ID 不在白名单
Dify 调用 mcp__dify_bridge__dify_ask completed 无此行 → Dify 服务/MCP 桥接异常
回复 response ready + 钉钉收到带 [1] 引用回复 超时 → Dify 应用未发布或 LLM 慢

五、一个致命坑:懒安装后的 pycache 缓存

5.1 现象

连接成功(Connected via Stream Mode),但发消息后 SDK 层报错:

ERROR dingtalk_stream.client: error processing message: '_IncomingHandler' object has no attribute 'raw_process'

5.2 根因

gateway 自动装 SDK 是「懒安装」——插件代码在 SDK 安装前就被编译缓存了__pycache__/*.pyc)。编译时 SDK 还没装,适配器的消息处理类继承的是空基类(而非 SDK 的 ChatbotHandler),导致运行时缺 raw_process 方法。新进程加载的是旧缓存,继承链断裂

5.3 修复

清掉插件缓存,强制重新编译,重启:

rm -rf ~/.hermes/hermes-agent/plugins/platforms/dingtalk/__pycache__

hermes gateway restart

重启后 Connected via Stream Mode + 消息正常处理。判断线索:pyc 文件时间戳早于 SDK 安装时间 = 缓存的是旧版。

六、验证链路(真实日志)

6.1 真实日志

钉钉发「x-office有哪些功能」后,消息完整走通:

[Dingtalk] _send_emotion: reply 🤔Thinking          ← 钉钉表情:思考中

gateway.run: inbound message: platform=dingtalk user=周贵鲁 msg='x-office有哪些功能'

agent.turn_context: conversation turn: platform=dingtalk

agent.tool_executor: tool mcp__dify_bridge__dify_ask completed

gateway.run: response ready: time=20.5s response=55 chars

[Dingtalk] Sending response (55 chars)

[Dingtalk] _send_emotion: recall 🤔Thinking + reply 🥳Done   ← 表情:完成

钉钉收到回答:「根据知识库内容,X-Office 提供会议纪要、任务管理、周报生成三大核心能力 [1]。」——干净、带引用。

6.2 钉钉表情交互(加分项)

钉钉适配器原生带表情交互(🤔Thinking → 🥳Done),收到消息自动显示「思考中」表情、完成时回收换「完成」表情——比飞书/企微多了实时反馈,体验更好。

七、三平台并存

飞书、企业微信、钉钉可以同时在线(一个 Hermes 大脑、三个聊天软件入口):

gateway.run: Gateway running with 3 platform(s)

会话按平台天然隔离(agent:main:dingtalk:... / agent:main:feishu:... / agent:main:wecom:...),互不干扰——员工用哪款办公软件,都能在聊天窗口里问知识库。

国内办公三巨头全覆盖:企业客户问「支持钉钉/飞书/企微吗」,答案都是「接」。

八、总结

钉钉接入一句话:免费建团队(组织壳)→ 建企业内部应用 + 机器人(Stream 模式)→ 发布 + 可见范围 → Hermes 配两个凭证,链路就通了。唯一坑是懒安装后的 pycache 缓存(清缓存 + 重启即修复)。

方案边界:Stream 模式虽零公网,但属于企业内部应用形态(个人免费「团队」也在此范畴,可正常使用)。如果未来需要回调公网 HTTPS 端点的高级场景(如接收钉钉卡片回调),则需改用 HTTP 模式并准备公网域名 + TLS 证书。三平台(钉钉/飞书/企微)可同时接入且互不干扰;同平台多机器人在 v0.20.0 有会话隔离限制(详见系列(一)企业微信篇第九节),生产环境建议单机器人。

这套方案适合:用钉钉办公、想把知识库变成「聊天窗口里随叫随到的 AI 助手」的企业;以及想用个人账号自建 AI 助手的开发者——零企业资质、零公网、免费跑通。

九、常见问题 FAQ

Q1:一定要建团队(组织)吗?个人账号不能直接建应用?

A:钉钉应用必须归属于某个组织。个人开发者没有企业资质时,免费建「团队」即可,一个手机号最多建 10 个团队,无需认证。

Q2:为什么连接成功但发消息报 raw_process 缺失?

A:懒安装后的 pycache 缓存问题。清掉 plugins/platforms/dingtalk/__pycache__/ 后重启 gateway 即可。

Q3:DINGTALK_ALLOWED_USERS=* 生产能用吗?

A:不能。生产必须填具体钉钉 User ID(从 gateway 日志的 sender_id 字段获取),否则任何知道机器人入口的人都能触发你的 Hermes Agent,产生费用和安全风险。

Q4:钉钉/飞书/企微能同时在线吗?

A:能。Hermes 单实例多平台(实测三平台在线),会话按平台天然隔离(agent:main:dingtalk / feishu / wecom),互不干扰。

十、参考资料


本系列其他篇


本文由 AI 协作完成:接入、排障、优化均为实测过程,数据取自真实运行日志。有问题欢迎评论区交流。

联系我

15088711270

手机端点击号码可直接拨打 · 桌面端可复制

微信二维码

扫码加微信 · 备注「门户」更快通过